/* 
 * File:   LoggerManager.h
 * Author: Gab'z
 *
 * Created on 8 juin 2012, 13:52
 */

#ifndef LOGGERMANAGER_H
#define	LOGGERMANAGER_H

#include "Logger.h"
#include <map>

namespace calculator {
    
    /**
     * Classe conteneur de Logger.
     * Chaque classe utilisant un logger stocke effectivement son Logger dans ce conteneur.
     * Permet d'assurer l'existence d'un unique Logger par classe et d'identifier
     * la classe à l'origine du log généré.
     */
    class LoggerManager {
    public:
        
        /**
         * Singleton LoggerManager.
         * @return crée et/ou renvoie l'unique instance de LoggerManager.
         */
        static LoggerManager* getInstance();
        
        /**
         * Singleton LoggerManager.
         * Détruit l'unique instance de LoggerManager.
         * Permet de libérer la mémoire prise pour stocker les logger,
         * doit ainsi être utilisé en tout dernier dans l'application.
         */
        static void deleteInstance();

        /**
         * Génère ou renvoie un Logger pour une classe donnée.
         * @param classname le nom de la classe qui l'utilise 
         * (en Java, on passerait directement une classe pour en 
         * avoir ses métadonnées, ce la n'existe pas en C++).
         * @return le logger de la classe indiquée, le crée si besoin.
         */
        Logger* getLogger(const std::string& classname);

    private:
        
        /**
         * instance du Singleton LoggerManager.
         */
        static LoggerManager* instance;
        
        /**
         * Le conteneur de Logger.
         */
        std::map<const std::string, Logger* const> _loggers;
        
        /**
         * Constructeur privé utilisé par le Singleton.
         */
        LoggerManager();
        
        /**
         * Destructeur privé utilisé par le Singleton.
         */
        virtual ~LoggerManager();
    };
}
#endif	/* LOGGERMANAGER_H */

